<!DOCTYPE html>
<html lang="en-US">
    <head>
        <title>Algorithm::C3 - A module for merging hierarchies using the C3 algorithm - metacpan.org</title>
        <link rel="preload" as="fetch" href="https://metacpan.org/account/login_status" crossorigin="anonymous" />
        <link href="https://metacpan.org/_assets/b8ccceeed47a0652049703d99326a9cea4933443.css" rel="stylesheet" type="text/css">
        <script src="https://metacpan.org/_assets/6bfedafe2d7caa915b7d84f61b45936818e3242e.js" type="text/javascript" defer></script>
        <link rel="alternate" type="application/rss+xml" title="Recent CPAN Uploads of Algorithm-C3 - MetaCPAN" href="https://metacpan.org/dist/Algorithm-C3/releases.rss" />
        <link rel="canonical" href="./Algorithm::C3.html" />
        <meta name="description" content="A module for merging hierarchies using the C3 algorithm" />
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5">
        <link rel="shortcut icon" href="https://metacpan.org/static/icons/favicon.ico">
        <link rel="apple-touch-icon" sizes="152x152" href="https://metacpan.org/static/icons/apple-touch-icon.png">
        <link rel="search" href="https://metacpan.org/static/opensearch.xml" type="application/opensearchdescription+xml" title="MetaCPAN">
        <script>
          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

          (function(skey, ga_id){
            ga('create', ga_id, {
              siteSpeedSampleRate : 100,
              storage             : 'none',
              clientId            : localStorage.getItem(skey)
            });
            ga(function(tracker) {
              localStorage.setItem(skey, tracker.get('clientId'));
            });
            ga('send', 'pageview');
          })('ga:clientId', 'UA-27829474-1');
        </script>
<meta name="twitter:card"        content="summary" />
<meta name="twitter:url"         content="https://metacpan.org/pod/Algorithm::C3" />
<meta name="twitter:title"       content="Algorithm::C3" />
<meta name="twitter:description" content="A module for merging hierarchies using the C3 algorithm" />
<meta name="twitter:site"        content="metacpan" />
    </head>
    <body>
        <nav class="navbar navbar-default" role="navigation">
            <div class="header-logo-large hidden-xs">
              <a href="https://metacpan.org/" tabindex="0">
                <svg class="logo" aria-label="MetaCPAN">
                  <use class="logo" href="/static/images/metacpan-logo.svg#logo" />
                </svg>
              </a>
            </div>
            <div class="header-logo-icon visible-xs">
              <a href="https://metacpan.org/">
                <svg class="logo" aria-label="MetaCPAN">
                  <use class="logo" href="/static/images/metacpan-logo.svg#dots" />
                </svg>
              </a>
            </div>
            <ul class="nav navbar-nav menu-items hidden-xs hidden-sm">
              <li><a href="https://metacpan.org/about">About</a></li>
              <li><a href="https://metacpan.org/about/sponsors">Sponsor</a></li>
              <li><a href="https://grep.metacpan.org/">grep::cpan</a></li>
              <li><a href="https://metacpan.org/recent">Recent</a></li>
              <li><a href="https://metacpan.org/about/faq">FAQ</a></li>
              <li><a href="https://metacpan.org/tools">Tools</a></li>
              <li><a href="https://fastapi.metacpan.org/">API</a></li>
            </ul>
            <ul class="nav navbar-nav navbar-right">
                <button type="button" class="searchbar-btn visible-xs visible-sm">
                    <i class="fa fa-search button-fa-icon"></i>
                </button>
                <form action="https://metacpan.org/search" class="searchbar-form visible-md visible-lg search-form form-horizontal">
                   <input type="hidden" name="size" id="metacpan_search-size" value="20">
                  <div class="form-group">
                      <div class="search-group">
                        <i class="fa fa-search"></i>
                        <input type="text" name="q" placeholder="Search the CPAN" size="41" autocorrect="off" autocapitalize="off" spellcheck="false" id="metacpan_search-input" class="form-control" value="">
                      </div>
                  </div>
                </form>
                    <li class="icon-slidepanel visible-xs visible-sm">
                      <button data-toggle="slidepanel" data-target=".slidepanel">
                        <span class="button-fa-icon">
                          <i class="fa fa-bars slidepanel-open"></i>
                          <i class="fa fa-times slidepanel-close"></i>
                        </span>
                      </button>
                    </li>
                <form action="https://metacpan.org/account/logout" method="POST" id="metacpan-logout"></form>
                <li class="dropdown logged_in" style="display: none;">
                    <button type="button" class="dropdown-toggle" data-toggle="dropdown">
                      <i class="fa fa-user button-fa-icon logged-in-icon" aria-hidden="true"></i>
                      <i class="fas fa-chevron-down"></i>
                    </button>
                    <ul class="dropdown-menu">
                        <li><a href="https://metacpan.org/account/identities">Identities</a></li>
                        <li><a href="https://metacpan.org/account/profile">Profile</a></li>
                        <li><a href="https://metacpan.org/account/favorite/list">Favorites</a></li>
                        <li>
                            <a href="./Algorithm::C3.html#" type="button" onclick="$('#metacpan-logout').submit(); return false">
                              Logout
                            </a>
                        </li>
                    </ul>
                </li>
                <li class="dropdown logged_out" style="display: none;">
                    <button type="button" class="dropdown-toggle" data-toggle="dropdown">
                      <i class="fa fa-user button-fa-icon" aria-hidden="true"></i>
                      <i class="fas fa-chevron-down"></i>
                    </button>
                    <ul class="dropdown-menu">
                        <li>
                            <a href="https://metacpan.org/login/github">
                                <i class="fab fa-github fa-fw"></i>
                                GitHub
                            </a>
                        </li>
                        <li>
                            <a href="https://metacpan.org/login/twitter">
                                <i class="fab fa-twitter fa-fw"></i>
                                Twitter
                            </a>
                        </li>
                        <li>
                            <a href="https://metacpan.org/login/google">
                                <i class="fab fa-google fa-fw"></i>
                                Google
                            </a>
                        </li>
                    </ul>
                </li>
                <li class="dropdown logged_placeholder">
                    <button>
                      <i class="fa fa-user button-fa-icon" aria-hidden="true"></i>
                    </button>
                </li>
            </ul>
        </nav>
        <div class="page-content ">
          <!--
          <div class="top-notify-banner">
            <i class="fas fa-info-circle"></i>
          </div>
          -->
          <nav class="sidebar">
            <div class="slidepanel">
              <ul class="nav-list ">
    <li class="nav-header no-margin-top">
      <div class="ttip" data-toggle="tooltip" data-placement="bottom" title="The date that this version of Algorithm-C3 was released.">
      <span class="relatize">10 Nov 2020 17:14:34 UTC</span>
    </li>
  <li>
    Distribution: <a href="https://metacpan.org/dist/Algorithm-C3">Algorithm-C3</a>
  </li>
  <li>
    Module version: 0.11
  </li>
  <li>
    <a data-keyboard-shortcut="g s" href="https://metacpan.org/dist/Algorithm-C3/source/lib/Algorithm/C3.pm">Source</a>
    (<a href="https://metacpan.org/dist/Algorithm-C3/source/lib/Algorithm/C3.pm?raw=1">raw</a>)
  </li>
  <li>
    <a data-keyboard-shortcut="g b" href="https://metacpan.org/dist/Algorithm-C3/source/lib/Algorithm">Browse</a>
    (<a href="https://metacpan.org/dist/Algorithm-C3/source/lib/Algorithm?raw=1">raw</a>)
  </li>
    <li>
      <a data-keyboard-shortcut="g c" href="https://metacpan.org/dist/Algorithm-C3/changes">Changes</a>
    </li>
    <li>
      <a class="nopopup" href="https://metacpan.org/dist/Algorithm-C3/contribute">How to Contribute</a>
    </li>
    <li>
        <a rel="noopener nofollow" data-keyboard-shortcut="g r" href="https://github.com/moose/Algorithm-C3">Repository</a>
    </li>
    <li>
      <a rel="noopener nofollow" data-keyboard-shortcut="g i" href="https://rt.cpan.org/Public/Dist/Display.html?Name=Algorithm-C3">Issues</a>
      (0)
    </li>
    <li>
      <a rel="noopener nofollow" href="http://matrix.cpantesters.org/?dist=Algorithm-C3+0.11" title="Matrix">Testers</a>
        <span title="(pass / fail / na)">(<a rel="noopener nofollow" href="https://www.cpantesters.org/distro/A/Algorithm-C3.html?oncpan=1&amp;distmat=1&amp;version=0.11&amp;grade=2" style="color: #090">103</a> / <a rel="noopener nofollow" href="https://www.cpantesters.org/distro/A/Algorithm-C3.html?oncpan=1&amp;distmat=1&amp;version=0.11&amp;grade=3" style="color: #900">0</a> / <a rel="noopener nofollow" href="https://www.cpantesters.org/distro/A/Algorithm-C3.html?oncpan=1&amp;distmat=1&amp;version=0.11&amp;grade=4">0</a>)</span>
    </li>
    <li>
      <a rel="noopener nofollow" href="http://cpants.cpanauthors.org/release/HAARG/Algorithm-C3-0.11">Kwalitee</a>
    </li>
    <li>
      <div class="ttip" data-toggle="tooltip" data-placement="bottom" title="The # people with an indexing permission on Algorithm-C3 who have released something to CPAN in the last 2 years (i.e. the # people likely able to release critical fixes in a timely manner)">
      Bus factor: 1
      </div>
    </li>
    <li>
      <a rel="noopener nofollow" href="http://cpancover.com/latest/Algorithm-C3-0.11/index.html">100.00% Coverage </a>
    </li>
    <li>
      License: perl_5
    </li>
    <li>
      Perl: v5.6.0
    </li>
    <li class="nav-header">Activity</li>
    <li>
<div class="activity-graph">
    <img src="https://metacpan.org/dist/Algorithm-C3/activity.svg?res=month" />
    <div class="comment">24 month</div>
</div>
    </li>
    <li class="nav-header">Tools</li>
    <li>
      <a itemprop="downloadUrl" href="https://cpan.metacpan.org/authors/id/H/HA/HAARG/Algorithm-C3-0.11.tar.gz">
      Download (<span itemprop="fileSize">18.78KB</span>)</a>
    </li>
    <li>
      <a href="https://explorer.metacpan.org/?url=%2Fmodule%2FHAARG%2FAlgorithm-C3-0.11%2Flib%2FAlgorithm%2FC3.pm">
        MetaCPAN Explorer
      </a>
    </li>
    <li>
      <a href="https://metacpan.org/dist/Algorithm-C3/permissions">
        Permissions
      </a>
    </li>
    <li>
      <a href="https://metacpan.org/dist/Algorithm-C3/releases.rss">
        Subscribe to distribution
      </a>
    </li>
    <li>
      <button class="btn btn-link" data-toggle="modal" data-target="#metacpan_install-instructions-dialog">
        Install Instructions
      </button>
    </li>
    <li>
      <form action="https://metacpan.org/search">
        <input type="hidden" name="q" value="dist:Algorithm-C3">
        <input type="search" name="q" placeholder="Search distribution" class="form-control tool-bar-form">
        <input type="submit" style="display: none">
      </form>
    </li>
    <li>
      <form action="https://grep.metacpan.org/search">
        <input type="hidden" name="qd" value="Algorithm-C3">
        <input type="hidden" name="source" value="metacpan">
        <input type="search" name="q" placeholder="grep distribution" class="form-control tool-bar-form">
        <input type="submit" style="display: none">
     </form>
    </li>
    <li class="version-jump">
<select onchange="document.location.href=&#39;/release/&#39;+this.value+&#39;/view/lib/Algorithm/C3.pm&#39;" class="form-control tool-bar-form">
  <option disabled selected>Jump to version</option>
<option
  disabled
  value="HAARG/Algorithm-C3-0.11"
>0.11
  (HAARG on 2020-11-10)</option>
<option
  
  value="HAARG/Algorithm-C3-0.10"
>0.10
  (HAARG on 2014-08-16)</option>
<option
  
  value="HAARG/Algorithm-C3-0.09"
>0.09
  (HAARG on 2014-03-01)</option>
<option
  
  value="FLORA/Algorithm-C3-0.08"
>0.08
  (FLORA on 2009-05-27)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.07"
>0.07
  (BLBLACK on 2007-05-14)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.06"
>0.06
  (BLBLACK on 2006-11-17)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.05"
>0.05
  (BLBLACK on 2006-08-25)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.04"
>0.04
  (BLBLACK on 2006-08-09)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.03"
>0.03
  (BLBLACK on 2006-08-09)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.02"
>0.02
  (BLBLACK on 2006-07-30)</option>
<option
  
  value="STEVAN/Algorithm-C3-0.01"
>0.01
  (STEVAN on 2006-02-15)</option>
</select>
    </li>
    <li class="version-diff">
<select onchange="document.location.href='/release/HAARG/Algorithm-C3-0.11/diff/' + encodeURIComponent(this.value) + '/lib/Algorithm/C3.pm'
" class="form-control tool-bar-form">
  <option disabled selected>Diff with version</option>
<option
  disabled
  value="HAARG/Algorithm-C3-0.11"
>0.11
  (HAARG on 2020-11-10)</option>
<option
  
  value="HAARG/Algorithm-C3-0.10"
>0.10
  (HAARG on 2014-08-16)</option>
<option
  
  value="HAARG/Algorithm-C3-0.09"
>0.09
  (HAARG on 2014-03-01)</option>
<option
  
  value="FLORA/Algorithm-C3-0.08"
>0.08
  (FLORA on 2009-05-27)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.07"
>0.07
  (BLBLACK on 2007-05-14)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.06"
>0.06
  (BLBLACK on 2006-11-17)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.05"
>0.05
  (BLBLACK on 2006-08-25)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.04"
>0.04
  (BLBLACK on 2006-08-09)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.03"
>0.03
  (BLBLACK on 2006-08-09)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.02"
>0.02
  (BLBLACK on 2006-07-30)</option>
<option
  
  value="STEVAN/Algorithm-C3-0.01"
>0.01
  (STEVAN on 2006-02-15)</option>
</select>
    </li>

    <li>
<ul class="dependencies">
  <li class="nav-header">Dependencies</li>
  <li><a href="https://metacpan.org/pod/Carp" title="Carp" class="ellipsis">Carp</a></li>
  <li>
    <hr>
  </li>
  <li>
    <a href="https://metacpan.org/module/Algorithm::C3/requires">Reverse dependencies</a>
  </li>
  <li>
    <a href="http://deps.cpantesters.org/?module=Algorithm%3A%3AC3">CPAN Testers List</a>
  </li>
  <li>
    <a href="https://cpandeps.grinnz.com/?dist=Algorithm-C3">Dependency graph</a>
  </li>
</ul>
    </li>
    <li class="nav-header">Permalinks</li>
    <li>
      <a href="https://metacpan.org/release/HAARG/Algorithm-C3-0.11/view/lib/Algorithm/C3.pm">This version</a>
    </li>
    <li>
      <a href="./Algorithm::C3.html">Latest version</a>
    </li>
    <li>
<div class="plussers">
<div class="nav-header">++ed by:</div>
<div>
    2 non-PAUSE users
</div>
</div>
    </li>
    <li>
<div id="metacpan_contributors">
  <div>
    <button class="btn-link"
      onclick="$(this).hide(); $('#metacpan_contributors ul').slideDown(); return false;"
    >and 2 contributors</button>
  </div>
  <ul style="display: none">
    <li class="contributor"
      data-contrib-email="stevan@iinteractive.com"
    >
      <img class="gravatar" width="20" height="20" src="https://www.gravatar.com/avatar/d41d8cd98f00b204e9800998ecf8427e?d=identicon&amp;s=20" />
      Stevan Little
    </li>
    <li class="contributor"
      data-cpan-author="BLBLACK"
      data-contrib-email="blblack@gmail.com"
    >
      <a href="https://metacpan.org/author/BLBLACK" class="cpan-author">
      <img class="gravatar" width="20" height="20" src="https://www.gravatar.com/avatar/5496172744d8328f4b950e2f19caa503?d=identicon&amp;s=20" />
      Brandon L. Black
      </a>
    </li>
  </ul>
</div>
    </li>
              </ul>
            </div>
          </nav>
          <div class="content-navigation">
<div class="breadcrumbs">
  <span>
    <a data-keyboard-shortcut="g a" rel="author" href="https://metacpan.org/author/HAARG" class="author-name">Graham Knop</a>
  </span>
  <span>&nbsp;/&nbsp;</span>
  <div class="release dist-release status-latest maturity-released">
    <span class="dropdown"><b class="caret"></b></span>
<select onchange="document.location.href=&#39;/release/&#39;+this.value+&#39;/view/lib/Algorithm/C3.pm&#39;" class="">
<option
  selected
  value="HAARG/Algorithm-C3-0.11"
>0.11
  (HAARG on 2020-11-10)</option>
<option
  
  value="HAARG/Algorithm-C3-0.10"
>0.10
  (HAARG on 2014-08-16)</option>
<option
  
  value="HAARG/Algorithm-C3-0.09"
>0.09
  (HAARG on 2014-03-01)</option>
<option
  
  value="FLORA/Algorithm-C3-0.08"
>0.08
  (FLORA on 2009-05-27)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.07"
>0.07
  (BLBLACK on 2007-05-14)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.06"
>0.06
  (BLBLACK on 2006-11-17)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.05"
>0.05
  (BLBLACK on 2006-08-25)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.04"
>0.04
  (BLBLACK on 2006-08-09)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.03"
>0.03
  (BLBLACK on 2006-08-09)</option>
<option
  
  value="BLBLACK/Algorithm-C3-0.02"
>0.02
  (BLBLACK on 2006-07-30)</option>
<option
  
  value="STEVAN/Algorithm-C3-0.01"
>0.01
  (STEVAN on 2006-02-15)</option>
</select>
    <a data-keyboard-shortcut="g d" class="release-name" href="https://metacpan.org/dist/Algorithm-C3">Algorithm-C3-0.11</a>
  </div>
<span class="river-gauge-gauge">
  <svg width="24px"
       height="15px"
       version="1.1"
       xmlns="http://www.w3.org/2000/svg"
       xmlns:xlink="http://www.w3.org/1999/xlink">

    <g>
      <title>        River stage three &#10;
          • 3 direct dependents &#10;          • 511 total dependents
      </title>

      <rect x="0"  y="0" width="4" height="15" fill="#7ea3f2" />
      <rect x="5"  y="0" width="4" height="15" fill="#7ea3f2" />
      <rect x="10"  y="0" width="4" height="15" fill="#7ea3f2" />
      <rect x="15"  y="0" width="4" height="15" fill="#e4e2e2" />
      <rect x="20"  y="0" width="4" height="15" fill="#e4e2e2" />
    </g>
  </svg>

</span>
<div id="Algorithm-C3-fav" class="logged_in">
<form action="https://metacpan.org/account/favorite/add" style="display: inline" onsubmit="return favDistribution(this)">
    <input type="hidden" name="remove" value="0">
    <input type="hidden" name="release" value="Algorithm-C3-0.11">
    <input type="hidden" name="author" value="HAARG">
    <input type="hidden" name="distribution" value="Algorithm-C3">
    <button type="submit" class="favorite highlight"><span>2</span> ++</button>
</form>
</div>
<div class="logged_out">
<a href="./Algorithm::C3.html" onclick="alert('Please sign in to add favorites'); return false" class="favorite highlight">
<span>2</span> ++</a>
</div>
   / <span>Algorithm::C3</span>
</div>
          </div>
          <main class="content">


<nav class="toc">
  <div class="toc-header"><strong>Contents</strong></div>
<ul>
  <li><a href="./Algorithm::C3.html#NAME">NAME</a></li>
  <li><a href="./Algorithm::C3.html#SYNOPSIS">SYNOPSIS</a></li>
  <li><a href="./Algorithm::C3.html#DESCRIPTION">DESCRIPTION</a>
    <ul>
      <li><a href="./Algorithm::C3.html#What-is-C3?">What is C3?</a></li>
      <li><a href="./Algorithm::C3.html#How-does-C3-work.">How does C3 work.</a></li>
    </ul>
  </li>
  <li><a href="./Algorithm::C3.html#FUNCTION">FUNCTION</a></li>
  <li><a href="./Algorithm::C3.html#CODE-COVERAGE">CODE COVERAGE</a></li>
  <li><a href="./Algorithm::C3.html#SEE-ALSO">SEE ALSO</a>
    <ul>
      <li><a href="./Algorithm::C3.html#The-original-Dylan-paper">The original Dylan paper</a></li>
      <li><a href="./Algorithm::C3.html#The-prototype-Perl-6-Object-Model-uses-C3">The prototype Perl 6 Object Model uses C3</a></li>
      <li><a href="./Algorithm::C3.html#Parrot-now-uses-C3">Parrot now uses C3</a></li>
      <li><a href="./Algorithm::C3.html#Python-2.3-MRO-related-links">Python 2.3 MRO related links</a></li>
      <li><a href="./Algorithm::C3.html#C3-for-TinyCLOS">C3 for TinyCLOS</a></li>
    </ul>
  </li>
  <li><a href="./Algorithm::C3.html#AUTHORS">AUTHORS</a></li>
  <li><a href="./Algorithm::C3.html#COPYRIGHT-AND-LICENSE">COPYRIGHT AND LICENSE</a></li>
</ul></nav>
<div class="pod anchors">
<h1 id="NAME">NAME</h1>

<p>Algorithm::C3 - A module for merging hierarchies using the C3 algorithm</p>

<h1 id="SYNOPSIS">SYNOPSIS</h1>

<pre><code>  use Algorithm::C3;

  # merging a classic diamond
  # inheritance graph like this:
  #
  #    &lt;A&gt;
  #   /   \
  # &lt;B&gt;   &lt;C&gt;
  #   \   /
  #    &lt;D&gt;

  my @merged = Algorithm::C3::merge(
      &#39;D&#39;,
      sub {
          # extract the ISA array
          # from the package
          no strict &#39;refs&#39;;
          @{$_[0] . &#39;::ISA&#39;};
      }
  );

  print join &quot;, &quot; =&gt; @merged; # prints D, B, C, A</code></pre>

<h1 id="DESCRIPTION">DESCRIPTION</h1>

<p>This module implements the C3 algorithm. I have broken this out into it&#39;s own module because I found myself copying and pasting it way too often for various needs. Most of the uses I have for C3 revolve around class building and metamodels, but it could also be used for things like dependency resolution as well since it tends to do such a nice job of preserving local precedence orderings.</p>

<p>Below is a brief explanation of C3 taken from the <a href="./Class::C3.html">Class::C3</a> module. For more detailed information, see the <a href="./Algorithm::C3.html#SEE-ALSO">&quot;SEE ALSO&quot;</a> section and the links there.</p>

<h2 id="What-is-C3?"><a id="What"></a><a id="What-is-C3"></a>What is C3?</h2>

<p>C3 is the name of an algorithm which aims to provide a sane method resolution order under multiple inheritance. It was first introduced in the language Dylan (see links in the <a href="./Algorithm::C3.html#SEE-ALSO">&quot;SEE ALSO&quot;</a> section), and then later adopted as the preferred MRO (Method Resolution Order) for the new-style classes in Python 2.3. Most recently it has been adopted as the &#39;canonical&#39; MRO for Perl 6 classes, and the default MRO for Parrot objects as well.</p>

<h2 id="How-does-C3-work."><a id="How"></a><a id="How-does-C3-work"></a>How does C3 work.</h2>

<p>C3 works by always preserving local precedence ordering. This essentially means that no class will appear before any of it&#39;s subclasses. Take the classic diamond inheritance pattern for instance:</p>

<pre><code>     &lt;A&gt;
    /   \
  &lt;B&gt;   &lt;C&gt;
    \   /
     &lt;D&gt;</code></pre>

<p>The standard Perl 5 MRO would be (D, B, A, C). The result being that <b>A</b> appears before <b>C</b>, even though <b>C</b> is the subclass of <b>A</b>. The C3 MRO algorithm however, produces the following MRO (D, B, C, A), which does not have this same issue.</p>

<p>This example is fairly trivial, for more complex examples and a deeper explanation, see the links in the <a href="./Algorithm::C3.html#SEE-ALSO">&quot;SEE ALSO&quot;</a> section.</p>

<h1 id="FUNCTION">FUNCTION</h1>

<dl>

<dt id="merge-($root,-$func_to_fetch_parent,-$cache)"><a id="merge"></a><a id="merge--root---func_to_fetch_parent---cache"></a><b>merge ($root, $func_to_fetch_parent, $cache)</b></dt>
<dd>

<p>This takes a <code>$root</code> node, which can be anything really it is up to you. Then it takes a <code>$func_to_fetch_parent</code> which can be either a CODE reference (see <a href="https://metacpan.org/pod/SYNOPSIS">SYNOPSIS</a> above for an example), or a string containing a method name to be called on all the items being linearized. An example of how this might look is below:</p>

<pre><code>  {
      package A;

      sub supers {
          no strict &#39;refs&#39;;
          @{$_[0] . &#39;::ISA&#39;};
      }

      package C;
      our @ISA = (&#39;A&#39;);
      package B;
      our @ISA = (&#39;A&#39;);
      package D;
      our @ISA = (&#39;B&#39;, &#39;C&#39;);
  }

  print join &quot;, &quot; =&gt; Algorithm::C3::merge(&#39;D&#39;, &#39;supers&#39;);</code></pre>

<p>The purpose of <code>$func_to_fetch_parent</code> is to provide a way for <code>merge</code> to extract the parents of <code>$root</code>. This is needed for C3 to be able to do it&#39;s work.</p>

<p>The <code>$cache</code> parameter is an entirely optional performance measure, and should not change behavior.</p>

<p>If supplied, it should be a hashref that merge can use as a private cache between runs to speed things up. Generally speaking, if you will be calling merge many times on related things, and the parent fetching function will return constant results given the same arguments during all of these calls, you can and should reuse the same shared cache hash for all of the calls. Example:</p>

<pre><code>  sub do_some_merging {
      my %merge_cache;
      my @foo_mro = Algorithm::C3::Merge(&#39;Foo&#39;, \&amp;get_supers, \%merge_cache);
      my @bar_mro = Algorithm::C3::Merge(&#39;Bar&#39;, \&amp;get_supers, \%merge_cache);
      my @baz_mro = Algorithm::C3::Merge(&#39;Baz&#39;, \&amp;get_supers, \%merge_cache);
      my @quux_mro = Algorithm::C3::Merge(&#39;Quux&#39;, \&amp;get_supers, \%merge_cache);
      # ...
  }</code></pre>

</dd>
</dl>

<h1 id="CODE-COVERAGE"><a id="CODE"></a>CODE COVERAGE</h1>

<p>I use <b>Devel::Cover</b> to test the code coverage of my tests, below is the <b>Devel::Cover</b> report on this module&#39;s test suite.</p>

<pre><code> ------------------------ ------ ------ ------ ------ ------ ------ ------
 File                       stmt   bran   cond    sub    pod   time  total
 ------------------------ ------ ------ ------ ------ ------ ------ ------
 Algorithm/C3.pm           100.0  100.0  100.0  100.0  100.0  100.0  100.0
 ------------------------ ------ ------ ------ ------ ------ ------ ------
 Total                     100.0  100.0  100.0  100.0  100.0  100.0  100.0
 ------------------------ ------ ------ ------ ------ ------ ------ ------</code></pre>

<h1 id="SEE-ALSO"><a id="SEE"></a>SEE ALSO</h1>

<h2 id="The-original-Dylan-paper"><a id="The"></a>The original Dylan paper</h2>

<dl>

<dt id="http://www.webcom.com/haahr/dylan/linearization-oopsla96.html"><a id="http"></a><a id="http:-www.webcom.com-haahr-dylan-linearization-oopsla96.html"></a><a href="http://www.webcom.com/haahr/dylan/linearization-oopsla96.html">http://www.webcom.com/haahr/dylan/linearization-oopsla96.html</a></dt>
<dd>

</dd>
</dl>

<h2 id="The-prototype-Perl-6-Object-Model-uses-C3"><a id="The1"></a>The prototype Perl 6 Object Model uses C3</h2>

<dl>

<dt id="http://svn.openfoundry.org/pugs/perl5/Perl6-MetaModel/"><a id="http1"></a><a id="http:-svn.openfoundry.org-pugs-perl5-Perl6-MetaModel"></a><a href="http://svn.openfoundry.org/pugs/perl5/Perl6-MetaModel/">http://svn.openfoundry.org/pugs/perl5/Perl6-MetaModel/</a></dt>
<dd>

</dd>
</dl>

<h2 id="Parrot-now-uses-C3"><a id="Parrot"></a>Parrot now uses C3</h2>

<dl>

<dt id="http://aspn.activestate.com/ASPN/Mail/Message/perl6-internals/2746631"><a id="http2"></a><a id="http:-aspn.activestate.com-ASPN-Mail-Message-perl6-internals-2746631"></a><a href="http://aspn.activestate.com/ASPN/Mail/Message/perl6-internals/2746631">http://aspn.activestate.com/ASPN/Mail/Message/perl6-internals/2746631</a></dt>
<dd>

</dd>
<dt id="http://use.perl.org/~autrijus/journal/25768"><a id="http3"></a><a id="http:-use.perl.org-autrijus-journal-25768"></a><a href="http://use.perl.org/~autrijus/journal/25768">http://use.perl.org/~autrijus/journal/25768</a></dt>
<dd>

</dd>
</dl>

<h2 id="Python-2.3-MRO-related-links"><a id="Python"></a>Python 2.3 MRO related links</h2>

<dl>

<dt id="http://www.python.org/2.3/mro.html"><a id="http4"></a><a id="http:-www.python.org-2.3-mro.html"></a><a href="http://www.python.org/2.3/mro.html">http://www.python.org/2.3/mro.html</a></dt>
<dd>

</dd>
<dt id="http://www.python.org/2.2.2/descrintro.html#mro"><a id="http5"></a><a id="http:-www.python.org-2.2.2-descrintro.html-mro"></a><a href="http://www.python.org/2.2.2/descrintro.html#mro">http://www.python.org/2.2.2/descrintro.html#mro</a></dt>
<dd>

</dd>
</dl>

<h2 id="C3-for-TinyCLOS"><a id="C3"></a>C3 for TinyCLOS</h2>

<dl>

<dt id="http://www.call-with-current-continuation.org/eggs/c3.html"><a id="http6"></a><a id="http:-www.call-with-current-continuation.org-eggs-c3.html"></a><a href="http://www.call-with-current-continuation.org/eggs/c3.html">http://www.call-with-current-continuation.org/eggs/c3.html</a></dt>
<dd>

</dd>
</dl>

<h1 id="AUTHORS">AUTHORS</h1>

<p>Stevan Little, &lt;stevan@iinteractive.com&gt;</p>

<p>Brandon L. Black, &lt;blblack@gmail.com&gt;</p>

<h1 id="COPYRIGHT-AND-LICENSE"><a id="COPYRIGHT"></a>COPYRIGHT AND LICENSE</h1>

<p>Copyright 2006 by Infinity Interactive, Inc.</p>

<p><a href="http://www.iinteractive.com">http://www.iinteractive.com</a></p>

<p>This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.</p></div>

<div id="metacpan_install-instructions-dialog" class="modal fade">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <h4 class="modal-title">Module Install Instructions</h4>
      </div>
      <div class="modal-body">
        <p>To install Algorithm::C3, copy and paste the appropriate command in to your terminal.</p>
        <p><a href="https://metacpan.org/dist/App-cpanminus/view/bin/cpanm">cpanm</a></p>
        <pre><code>cpanm Algorithm::C3</code></pre>
        <p><a href="https://metacpan.org/pod/CPAN">CPAN shell</a></p>
        <pre><code>perl -MCPAN -e shell
install Algorithm::C3</code></pre>
        <p>For more information on module installation, please visit <a href="https://www.cpan.org/modules/INSTALL.html">the detailed CPAN module installation guide</a>.</p>
      </div>
      <div class="modal-footer">
        <a href="./Algorithm::C3.html#" data-dismiss="modal" class="btn">Close</a>
      </div>
    </div>
  </div>
</div>
          </main>
          <div class="content-pagination">
          </div>
        </div>
        <footer class="footer">
          <div class="footer-container">
            <div class="footer-social">
              <div class="footer-link footer-logo">
                <a href="https://metacpan.org/">
                  <img src="https://metacpan.org/static/images/metacpan-logo.svg" alt="MetaCPAN" />
                </a>
              </div>
              <a class="footer-social-link" href="https://github.com/metacpan">
                <i class="fab fa-github-square"></i>
              </a>
              <a class="footer-social-link" href="https://fosstodon.org/@metacpan">
                <i class="fab fa-mastodon"></i>
              </a>
            </div>
            <div class="footer-links">
              <div class="footer-link">
                  <a href="https://metacpan.org/about">About</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/about/sponsors">Sponsor</a>
              </div>
              <div class="footer-link">
                  <a href="https://grep.metacpan.org">grep::cpan</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/recent">Recent</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/about/faq">FAQ</a>
              </div>
              <div class="footer-link">
                  <a href="https://metacpan.org/tools">Tools</a>
              </div>
              <div class="footer-link">
                  <a href="https://fastapi.metacpan.org/">API</a>
              </div>
              <div class="footer-link">
                  <a href="https://www.perl.org/">Perl.org</a>
              </div>
            </div>
            <div class="footer-sponsors">
              <a class="footer-sponsor-link" target="_blank" href="https://www.bytemark.co.uk/" rel="noopener">
                <img class="footer-sponsor-bytemark" src="https://metacpan.org/static/images/sponsors/bytemark_logo.svg" alt="Bytemark logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://www.liquidweb.com/" rel="noopener">
                <img class="footer-sponsor-liquidweb" src="https://metacpan.org/static/images/sponsors/liquidweb_logo.png" alt="liquidweb logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://deriv.com/careers/" rel="noopener">
                <img class="footer-sponsor-deriv" src="https://metacpan.org/static/images/sponsors/deriv.svg" alt="Deriv logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://geocode.xyz" rel="noopener">
                <img class="footer-sponsor-geocode" src="https://metacpan.org/static/images/sponsors/geocodelogo.svg" alt="Geocode logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://www.fastly.com/" rel="noopener">
                <img class="footer-sponsor-fastly" src="https://metacpan.org/static/images/sponsors/fastly_logo.svg" alt="Fastly logo">
              </a>
              <a class="footer-sponsor-link" target="_blank" href="https://opencagedata.com" rel="noopener">
                <img class="footer-sponsor-opencage" src="https://metacpan.org/static/images/sponsors/open-cage.svg" alt="OpenCage logo">
              </a>
            </div>
          </div>
        </footer>
        <div class="modal fade" tabindex="-1" role="dialog" id="metacpan_keyboard-shortcuts">
          <div class="modal-dialog">
            <div class="modal-content">
              <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h4 class="modal-title">Keyboard Shortcuts</h4>
              </div>
              <div class="modal-body row">
<div class="col-md-6">
  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>Global</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="keys">
          <kbd>s</kbd>
        </td>
        <td>Focus search bar</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>?</kbd>
        </td>
        <td>Bring up this help dialog</td>
      </tr>
    </tbody>
  </table>

  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>GitHub</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>p</kbd>
        </td>
        <td>Go to pull requests</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>i</kbd>
        </td>
        <td>go to github issues (only if github is preferred repository)</td>
      </tr>
    </tbody>
  </table>
</div>

<div class="col-md-6">
  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>POD</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>a</kbd>
        </td>
        <td>Go to author</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>c</kbd>
        </td>
        <td>Go to changes</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>i</kbd>
        </td>
        <td>Go to issues</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>d</kbd>
        </td>
        <td>Go to dist</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>r</kbd>
        </td>
        <td>Go to repository/SCM</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>s</kbd>
        </td>
        <td>Go to source</td>
      </tr>
      <tr>
        <td class="keys">
          <kbd>g</kbd> <kbd>b</kbd>
        </td>
        <td>Go to file browse</td>
      </tr>

    </tbody>
  </table>
</div>

<div class="col-md-12">
  <table class="table keyboard-shortcuts">
    <thead>
      <tr>
        <th></th>
        <th>Search terms</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><em>module:</em> (e.g. <a href="https://metacpan.org/search?q=module%3APlugin">module:Plugin</a>)</td>
      </tr>
      <tr>
        <td><em>distribution:</em> (e.g. <a href="https://metacpan.org/search?q=distribution%3ADancer+auth">distribution:Dancer auth</a>)</td>
      </tr>
      <tr>
        <td><em>author:</em> (e.g. <a href="https://metacpan.org/search?q=author%3ASONGMU+Redis">author:SONGMU Redis</a>)</td>
      </tr>
      <tr>
        <td><em>version:</em> (e.g. <a href="https://metacpan.org/search?q=version%3A1.00">version:1.00</a>)</td>
      </tr>
    </tbody>
  </table>
</div>
              </div>
              <div class="modal-footer"></div>
            </div>
          </div>
        </div>
    </body>
</html>
